/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Beans;

import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.inject.Named;
import org.primefaces.model.chart.CartesianChartModel;
import session.CompteBancaireFacade;
import tp3.CompteBancaire;
import tp3.OperationBancaire;

/**
 *
 * @author Aurelie
 */
@Named(value = "compteMBean")
@SessionScoped
public class CompteMBean implements Serializable {

    @EJB
    private CompteBancaireFacade compteBancaireFacade;
    private CompteBancaire compteBancaire;
    private OperationBancaire operationBancaire;
    private String name;
    private long solde;
    private int numeroCompte;
    private long somme;
    private int numeroCompteCrediteur;
    List<CompteBancaire> listePourAffichage = null;
    /**
     * Creates a new instance of CompteMBean
     */
    public CompteMBean() {
    }

    public List<CompteBancaire> getListePourAffichage() {
        System.out.println("getListePourAffichage");
        // CETTE METHODE EST TOUJOURS APPELLE PLUSIEURS FOIS SI LA VUE EST PAR
        // EXEMPLE UNE DATATABLE OU UNE VUE COMPLIQUEE
        if (listePourAffichage == null) {
            rafraichirListeDesComptesDepuisLaBD();
        }

        return listePourAffichage;
    }

    private void rafraichirListeDesComptesDepuisLaBD() {
        // On fait le select * et on rafraichit le modele
        listePourAffichage = compteBancaireFacade.findAll();
    }

    public void setListePourAffichage(List<CompteBancaire> listePourAffichage) {
        this.listePourAffichage = listePourAffichage;
    }

    public void creerComptesTest() {
        compteBancaireFacade.creerComptesTest();
        rafraichirListeDesComptesDepuisLaBD();
    }

    public void savePerson(ActionEvent actionEvent) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(getName() + ", votre compte a bien été crée!"));
        compteBancaireFacade.addCompte(name, solde);
        rafraichirListeDesComptesDepuisLaBD();
    }

    public void deleteCompte(ActionEvent actionEvent) {
        if (numeroCompte <= listePourAffichage.size() * 2) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("le compte numéro : " + getNumeroCompte() + " a bien été supprimé"));
            compteBancaireFacade.supprimerCompte(numeroCompte);
            rafraichirListeDesComptesDepuisLaBD();
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("le nom : " + getName() + " n'existe pas"));

        }
    }

    public void modificationCompte(ActionEvent actionEvent) {
        if (numeroCompte <= listePourAffichage.size() *2) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("le compte numéro : " + getNumeroCompte() + " a bien été modifié"));
            compteBancaireFacade.modifierCompte(numeroCompte, name, solde);
            rafraichirListeDesComptesDepuisLaBD();

        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("le compte numéro : " + getNumeroCompte() + " n'existe pas"));

        }

    }

    public void versementCompte(ActionEvent actionEvent) {
        if (numeroCompte <= listePourAffichage.size() *2) {
            compteBancaireFacade.versementCompte(numeroCompte, somme);
            rafraichirListeDesComptesDepuisLaBD();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("le compte numéro : " + getNumeroCompte() + " a bien été crédité de : " + somme));

        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("le compte numéro : " + getNumeroCompte() + " n'existe pas"));

        }
    }

    public void retraitCompte(ActionEvent actionEvent) {
        if (numeroCompte <= listePourAffichage.size() *2) {
            compteBancaireFacade.retraitCompte(numeroCompte, somme);
            rafraichirListeDesComptesDepuisLaBD();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("le compte numéro : " + getNumeroCompte() + " a bien été débiter de : " + somme));

        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("le compte numéro : " + getNumeroCompte() + " n'existe pas"));

        }
    }

    public void virementCompte(ActionEvent actionEvent) {
        if ((numeroCompte <= listePourAffichage.size() *2) && (numeroCompteCrediteur <= listePourAffichage.size() *2)) {
            compteBancaireFacade.virementCompte(numeroCompte, numeroCompteCrediteur, somme);
            rafraichirListeDesComptesDepuisLaBD();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("le compte numéro : " + numeroCompte + " a bien été débiter de : " + somme + " € vers le compte : " + numeroCompteCrediteur));

        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("le compte numéro : " + getNumeroCompte() + " n'existe pas"));
        }
    }

    public Collection<OperationBancaire> getOperationsBancairesDuCompteADetailler() { 
        return compteBancaire.getOperations();
        
    }

    public String showDetails(CompteBancaire compteBancaire) {
        this.setCompteBancaire(compteBancaire);
        return "detail";
    }
    
    public List<SelectItem> getAllCompte() {
        List<SelectItem> options = new ArrayList<SelectItem>();
        List<Long> listCompte = compteBancaireFacade.getCompteBancaire();
    for(Long comptes : listCompte) {
        options.add(new SelectItem(comptes));
    }
    return options;
}
    

    /**
     * Renvoie les détails du client courant (celui dans l'attribut customer de
     * cette classe), qu'on appelle une propriété (property)
     *
     * @return
     */
    public CompteBancaire getDetails() {
        return getCompteBancaire();
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the solde
     */
    public long getSolde() {
        return solde;
    }

    /**
     * @param solde the solde to set
     */
    public void setSolde(long solde) {
        this.solde = solde;
    }

    /**
     * @return the numeroCompte
     */
    public int getNumeroCompte() {
        return numeroCompte;
    }

    /**
     * @param numeroCompte the numeroCompte to set
     */
    public void setNumeroCompte(int numeroCompte) {
        this.numeroCompte = numeroCompte;
    }

    /**
     * @return the somme
     */
    public long getSomme() {
        return somme;
    }

    /**
     * @param somme the somme to set
     */
    public void setSomme(long somme) {
        this.somme = somme;
    }

    /**
     * @return the numeroCompteCrediteur
     */
    public int getNumeroCompteCrediteur() {
        return numeroCompteCrediteur;
    }

    /**
     * @param numeroCompteCrediteur the numeroCompteCrediteur to set
     */
    public void setNumeroCompteCrediteur(int numeroCompteCrediteur) {
        this.numeroCompteCrediteur = numeroCompteCrediteur;
    }

    /**
     * @return the compteBancaire
     */
    public CompteBancaire getCompteBancaire() {
        return compteBancaire;
    }

    /**
     * @param compteBancaire the compteBancaire to set
     */
    public void setCompteBancaire(CompteBancaire compteBancaire) {
        this.compteBancaire = compteBancaire;
    }

    /**
     * @return the operationBancaire
     */
    public OperationBancaire getOperationBancaire() {
        return operationBancaire;
    }

    /**
     * @param operationBancaire the operationBancaire to set
     */
    public void setOperationBancaire(OperationBancaire operationBancaire) {
        this.operationBancaire = operationBancaire;
    }
}
